use std::cmp::Ordering;

#[derive(PartialEq, PartialOrd)]
pub struct EqF32(f32);

impl From<f32> for EqF32 {
    fn from(value: f32) -> Self {
        Self(value)
    }
}

impl From<&f32> for EqF32 {
    fn from(value: &f32) -> Self {
        Self(*value)
    }
}

impl Eq for EqF32 {}

impl Ord for EqF32 {
    fn cmp(&self, other: &Self) -> Ordering {
        match (self.0.is_nan(), other.0.is_nan()) {
            (false, false) => {
                // 两个值都不是 NaN，安全使用 partial_cmp
                self.0.partial_cmp(&other.0).unwrap()
            }
            (false, true) => {
                // self 不是 NaN，但 other 是 NaN，认为 self 更小
                Ordering::Less
            }
            (true, false) => {
                // self 是 NaN，但 other 不是 NaN，认为 self 更大
                Ordering::Greater
            }
            (true, true) => {
                // 两个值都是 NaN，认为相等
                Ordering::Equal
            }
        }
    }
}


#[derive(PartialEq, PartialOrd)]
pub struct EqF64(f64);

impl From<f64> for EqF64 {
    fn from(value: f64) -> Self {
        Self(value)
    }
}

impl From<&f64> for EqF64 {
    fn from(value: &f64) -> Self {
        Self(*value)
    }
}

impl Eq for EqF64 {}

impl Ord for EqF64 {
    fn cmp(&self, other: &Self) -> Ordering {
        match (self.0.is_nan(), other.0.is_nan()) {
            (false, false) => {
                // 两个值都不是 NaN，安全使用 partial_cmp
                self.0.partial_cmp(&other.0).unwrap()
            }
            (false, true) => {
                // self 不是 NaN，但 other 是 NaN，认为 self 更小
                Ordering::Less
            }
            (true, false) => {
                // self 是 NaN，但 other 不是 NaN，认为 self 更大
                Ordering::Greater
            }
            (true, true) => {
                // 两个值都是 NaN，认为相等
                Ordering::Equal
            }
        }
    }
}
